'''假设设计一个师生管理系统，具有学生和教师两种用户，需要设计两个类：教师类(Teacher)和学生类(Student)。
Student类有属性：学号、姓名、性别、专业等
Teacher类有属性：工号、姓名、性别、职称等
这两个类都有属性的getter和setter方法。这两个类有许多相同的属性和方法。因此可以用继承机制来实现。即将Student类和Teacher类中相同的属性和方法抽取出来，单独作为一个父类，称作用户类User，而Student类和Teacher类则作为子类继承User类， Student类和Teacher类中只定义自己独有的属性和方法即可。
'''

class User:
        __slots__=('__uid','__name','__gender')  # 限定了该类只有3个内部属性__uid,__name,__gender，不能动态增加   
        def __init__(self, uid, name, gender):  
            self.uid = uid   
            self.name = name       
            self.gender = gender

         ###对属性name的存取###  
        @property   
        def name(self):     
            return self.__name 

        @name.setter 
        def name(self,name):     
            self.__name = name

        ###对属性uid的存取###
        @property  
        def uid(self):     
            return self.__uid   
        @uid.setter  
        def uid(self, uid):    
            if len(str(uid))==4:     
                self.__uid = uid          
                return True      
            print('输入错误，id只能是四位！')    
            self.__uid='0000'     
            return False
                
        ###对属性gender的存取###
        @property
        def gender(self):  
            return self.__gender
        @gender.setter
        def gender(self, gender):    
            if gender in ['f','female','F','Female','女']:     
                    self.__gender = '女'       
                    return True  
            if gender in ['m','male','M','Male','男']:    
                self.__gender = '男'      
                return True  
            print('性别输入错误！')  
            self.__gender = ''  
            return False
        ###重写__str__方法###
        def __str__(self):   
            return str([self.uid,self.name,self.gender])





class Student(User):  
     #定义Student类，并继承于User类   
    __slots__=('__major') 
    # 限定了该类只有1个内部属性__major(专业），不能动态增加 
    def __init__(self, uid, name, gender, major):  
        super().__init__(uid, name, gender)     
        self.major = major 

         ###定义属性major的取操作###
    @property
    def major(self):   
        return self.__major  
    @major.setter  
    def major(self,major): # 相当于原来的setName方法   
        self.__major=major    
    ###重写__str__方法###   
    def __str__(self):       
        return str([self.uid,self.name,self.gender,self.major])
    



class Teacher(User): 
     # 定义Teacher类，并继承于User类  
    __slots__ = ('__title')
        # 限定了该类只有1个内部属性__title(职称），不能动态增加   
    def __init__(self, uid, name, gender, title):   
        super().__init__(uid, name, gender)       
        self.title = title    
    ###定义属性major的取操作###  
    @property    
    def title(self):     
        return self.__title  
    @title.setter  
    def title(self, title):  # 相当于原来的setName方法  
        self.__title = title   
    ###重写__str__方法###   
    def __str__(self):     
        return str([self.uid, self.name, self.gender, self.title])


u = User('0000','huang','f')
s = Student(1000,'zhangsan','male','大数据')
t = Teacher(1001,'wangli','女','教授')
print(u)
print(s)
print(t)
